import { ProxyOb } from "./ProxyOb";
import VmBase, { StringFormat } from "./VmBase";

/*
 * @features: 功能
 * @description: 说明
 * @Date: 2021-09-07 22:15:32
 * @Author: judu233(769471424@qq.com)
 * @LastEditTime: 2021-09-14 13:33:28
 * @LastEditors: judu233
 */
const { ccclass, property, executeInEditMode, menu } = cc._decorator;
@ccclass
@executeInEditMode
@menu('VM/VM-Label')
export default class VmLabel extends VmBase {

    @property({ displayName: `是否限制小数` })
    isClampValue = false;

    //保存着字符模板格式的数组 (只会影响显示参数)
    private templateFormatArr: string[] = [];

    /**保存的原始字符 */
    originText: string = null;

    /**初始化获取数据 */
    onValueInit() {
        if (this._canWatchData && this._canWatchComponent) {
            try {
                if (this.useMultipathMode) {
                    //多路径
                    this.originText = this.getComponentValue();
                    this.parseTemplate();
                    this.watchPathArr.forEach((path, index) => {
                        this.templateValueArr[index] = ProxyOb.getValue(path, `?`);
                    });
                    this.setComponentValue(this.getReplaceText()); // 重新解析
                } else {
                    //单路径
                    this.setComponentValue(ProxyOb.getValue(this.watchPath, '?'));
                }
            } catch (error) {
                cc.error(`节点${this.node.name}解析替换文本失败`);
            }
        }
    }

    /**监听数据发生了变动的情况 */
    onValueChanged(newVaule, oldValue, path: string) {
        if (this.isClampValue)
            newVaule = Number(newVaule).toFixed(2)
        if (this.useMultipathMode) {
            //寻找缓存位置
            let index = this.watchPathArr.findIndex(v => v === path);
            if (index >= 0) {
                //如果是所属的路径，就可以替换文本了
                this.templateValueArr[index] = newVaule; //缓存值
                this.setComponentValue(this.getReplaceText()); // 重新解析文本
            }
        } else {
            this.setComponentValue(newVaule);
        }
    }

    /**解析模板 获取初始格式化字符串格式 的信息 */
    parseTemplate() {
        let regexAll = /\{\{(.+?)\}\}/g; //匹配： 所有的{{value}}
        let regex = /\{\{(.+?)\}\}/;//匹配： {{value}} 中的 value
        let res = this.originText.match(regexAll);//匹配结果数组
        if (res == null) return;
        for (let i = 0; i < res.length; i++) {
            const e = res[i];
            let arr = e.match(regex);
            let matchName = arr[1];
            //let paramIndex = parseInt(matchName)||0;
            let matchInfo = matchName.split(':')[1] || '';
            this.templateFormatArr[i] = matchInfo;
        }
    }

    /**获取解析字符串模板后得到的值 */
    getReplaceText() {
        if (!this.originText) return "";
        let regexAll = /\{\{(.+?)\}\}/g; //匹配： 所有的{{value}}
        let regex = /\{\{(.+?)\}\}/;//匹配： {{value}} 中的 value
        let res = this.originText.match(regexAll);//匹配结果数组 [{{value}}，{{value}}，{{value}}]
        if (res == null) return '';//未匹配到文本
        let str = this.originText;//原始字符串模板 "name:{{0}} 或 name:{{0:fix2}}"

        for (let i = 0; i < res.length; i++) {
            const e = res[i];
            let getValue;
            let arr = e.match(regex); //匹配到的数组 [{{value}}, value]
            let indexNum = parseInt(arr[1] || '0') || 0; //取出数组的 value 元素 转换成整数
            let format = this.templateFormatArr[i]; //格式化字符 的 配置参数
            getValue = this.templateValueArr[indexNum];
            str = str.replace(e, StringFormat.deal(getValue, format));//从路径缓存值获取数据
        }
        return str;
    }
}
